// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.SQLUtils;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
// import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExprGroup;
// import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor*;

// import java.util.ArrayList;
// import java.util.std::list;
#pragma once
#include <string>
#include <list>

#include "../SQLStatementImpl.h"
#include "../SQLReplaceable.h"
#include "../../../utils/common_ptr.h"

class SQLWithSubqueryClause;
class SQLUpdateSetItem;
class SQLExpr;
class SQLTableSource;
class SQLAssignItem;
class SQLOrderBy;
class SQLName;
class Object;
class DbType;

class SQLUpdateStatement : virtual public SQLStatementImpl, virtual public SQLReplaceable
{
public:
  SQLWithSubqueryClause_ptr with; // for pg

  SQLUpdateSetItem_list_ptr items;
  SQLExpr_ptr where;
  SQLTableSource_ptr from;

  SQLTableSource_ptr tableSource;
  SQLExpr_list_ptr returning;

  SQLAssignItem_list_ptr partitions;

  // for mysql
  SQLOrderBy_ptr orderBy;

  SQLUpdateStatement();
  SHAREDOBJECT(SQLUpdateStatement);

  void cloneTo(SQLUpdateStatement_ptr x);

  virtual SQLObject_ptr clone();
  SQLUpdateStatement(DbType_ptr dbType);

  SQLTableSource_ptr getTableSource();

  void setTableSource(SQLExpr_ptr expr);

  void setTableSource(SQLTableSource_ptr tableSource);

  SQLName_ptr getTableName();

  SQLAssignItem_list_ptr getPartitions();

  void setPartitions(SQLAssignItem_list_ptr partitions);

  SQLExpr_ptr getWhere();

  void setWhere(SQLExpr_ptr where);

  SQLUpdateSetItem_list_ptr getItems();

  void addItem(SQLUpdateSetItem_ptr item);

  SQLExpr_list_ptr getReturning();

  SQLTableSource_ptr getFrom();

  void setFrom(SQLTableSource_ptr from);

  void accept0(SQLASTVisitor_ptr visitor);

  void acceptChild(SQLASTVisitor_ptr visitor);

  SQLObject_list_ptr getChildren();

  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  SQLOrderBy_ptr getOrderBy();

  void setOrderBy(SQLOrderBy_ptr orderBy);

  SQLWithSubqueryClause_ptr getWith();

  void setWith(SQLWithSubqueryClause_ptr with);

  void addCondition(string_ptr conditionSql);

  void addCondition(SQLExpr_ptr expr);

  BOOL_ptr removeCondition(string_ptr conditionSql);

  BOOL_ptr removeCondition(SQLExpr_ptr condition);

  bool equals(Object_ptr o);

  int hashCode();

  BOOL_ptr addWhere(SQLExpr_ptr where);
};
